perm filename WIX2SB.FAI[VIS,HPM]9 blob sn#183727 filedate 1975-10-31 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00017 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		TITLE	WIX2SB
C00005 00003	AR2TAB:	MOVEI	T,44			TOTAL BITS/WORD
C00007 00004	HAFPIC:	POP	P,RETAD
C00011 00005	GETPAR:	POP	P,RETAD
C00012 00006	PERBIT:	POP	P,RETAD
C00013 00007	HISTOG:	POP	P,RETAD
C00015 00008	ROWSUM:	POP	P,RETAD
C00016 00009	UNPACK:	POP	P,RETAD	 UNPACK A DENSE BYTE ARRAY INTO A PICTURE
C00017 00010	SELECT:	POP	P,RETAD	 copy a piece of a picture into another
C00019 00011	ROWSUD:	POP	P,RETAD			much quicker and dirtier than ROWSUM
C00020 00012	SHFT1←←TEMP+1
C00024 00013	COPPIC:	POP	P,RETAD			COPIES A PICTURE IN PIC1
C00025 00014	CORNR←←TEMP				THESE FOUR WORDS MUST
C00027 00015	X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
C00037 00016	CENTRO:	POP	P,RETAD	 find centroid of black area in a window
C00039 00017		END
C00040 ENDMK
C⊗;
	TITLE	WIX2SB

;FULLY FORMAT 2 ORIENTED PICTURE ROUTINES. EXTENSIONS TO THE CONVERTED
;FORMAT 1 ROUTINES IN WIXSUB
	
	ENTRY	HAFPIC,COPPIC,MATCH,GETPAR,PERBIT,HISTOG,CMPPAR,ROWSUM,ROWSUD
	ENTRY	UNPACK,SELECT

	EXTERN	CORGET,CORREL
	INTERN	SQRS
	
	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BPTAB←←12
	LINTAB←←13

	T←1  ↔  TT←2  ↔  TTT←3  ↔  ARRY1←4  ↔  ARRY2←5  ↔  P←17
	A←6  ↔  B←7  ↔  C←10  ↔  D←11  ↔  E←13  ↔  F←14  ↔  G←15


RETAD:	0
TEMP:	BLOCK	25		;TEMPORARY STORAGE FOR STUFF

	FOR I←-77,-1,1 { I*4000000+I*I
				}
SQRS:	FOR I←0,77,1   { I*4000000+I*I
				}
AR2TAB:	MOVEI	T,44			;TOTAL BITS/WORD
	IDIV	T,BYBI(ARRY2)		;BYTE SIZE
	MOVEM	T,WDBY(ARRY2)		;BYTES PER WORD
	SUBI	TT,44			;-NUMBER OF USED BITS/WORD
	MOVNM	TT,WDBI(ARRY2)		;SAVED
	ADD	T,LNBY(ARRY2)
	SUBI	T,1
	IDIV	T,WDBY(ARRY2)		;NUMBER OF WORDS/SCANLINE
	MOVEM	T,LNWD(ARRY2)
	MOVE	TT,T	 		;WORDS/LINE
	IMUL	TT,WDBY(ARRY2)		;BYTES/WORD
	MOVEM	TT,LNBYA(ARRY2)		;GIVES BYTES/LINE, INCLUDING NULLS
	IMUL	TT,PCLN(ARRY2)
	MOVEM	TT,PCBYA(ARRY2)		;TOTAL BYTES/PIC, INCL. NULLS
	IMUL	T,PCLN(ARRY2)		;LINES IN THE PICTURE
	MOVEM	T,PCWD(ARRY2)		;WORDS IN THE PICTURE
	MOVE	T,LNBY(ARRY2)
	IMUL	T,PCLN(ARRY2)
	MOVEM	T,PCBY(ARRY2)		;BYTES/PIC, NOT INCL. NULLS
	MOVEI	T,14(ARRY2)
	ADD	T,PCLN(ARRY2)
	MOVEM	T,BPTAB(ARRY2)		;ADDRESS OF BYTE POINTER TABLE
	ADD	T,LNBYA(ARRY2)		;ADDR OF FIRST WORD IN PICTURE
	MOVN	TT,PCLN(ARRY2)		;SET UP CNTR FOR LINE ADDRESSES
	HRL	TT,TT
	HRRI	TT,LINTAB(ARRY2)
LTLP:	MOVEM	T,(TT)			;MAKE LINE TABLE
	ADD	T,LNWD(ARRY2)
	AOBJN	TT,LTLP
	MOVN	TT,BPTAB(ARRY2)
	HRL	TT,LNBYA(ARRY2)		;SET UP CNTR FOR BYTE TABLE
	AOBJN	TT,			;DECR ADDRESS AND INCR COUNT BY 1
	MOVN	TT,TT
	MOVEI	T,4400
	ADD	T,BYBI(ARRY2)
	LSH	T,6
	HRLZ	T,T
BYLP:	MOVEM	T,(TT)			;MAKE BYTE POINTER TABLE
	IBP	T
	AOBJN	TT,BYLP
	POPJ	P,
HAFPIC:	POP	P,RETAD
	POP	P,G	;MAXBIT
	POP	P,ARRY2			;MAKES A HALFSIZE VERSION
	POP	P,ARRY1			;OF A PICTURE
	MOVE	T,LNBY(ARRY1)		;HAFPIC(PICIN,PICOUT,BITMAX);
	ASH	T,-1			;NEW PIC IS HALF THE WIDTH
	MOVEM	T,LNBY(ARRY2)
	MOVE	T,PCLN(ARRY1)
	ASH	T,-1			;AND HALF THE HEIGHT
	MOVEM	T,PCLN(ARRY2)
	MOVE	T,BYBI(ARRY1)
	ADDI	T,2			;AND HAS TWO MORE BITS/PIXEL
	SUB	G,T			;UNLESS LIMITED TO LESS
        JUMPGE	G,.+2
        ADD	T,G
	MOVEM	T,BYBI(ARRY2)
	PUSHJ	P,AR2TAB		;SET UP ITS SKELETON
	MOVE	A,BPTAB(ARRY1)
	MOVE	A,-1(A)			;FIRST BYTE PNTR FOR ARRY1
	ADD	A,LINTAB(ARRY1)
	MOVE	B,BPTAB(ARRY2)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY2)
	MOVE	F,PCLN(ARRY2)		;NO OF LINES, FOR COUNT

		;IF NOT NEEDED TO REDUCE BITS/BYTE
	JUMPGE	G,[ LNLP: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
                          MOVE    C,A
                          ADD     A,LNWD(ARRY1)           ;BP S FOR ARRY1
                          MOVE    D,A
                          ADD     A,LNWD(ARRY1)
                          MOVE    E,B                     ;BP FOR ARRY2
                          ADD     B,LNWD(ARRY2)
                  CLLP:   ILDB    T,C                     ;FETCH FOUR BYTES AND ADD THEM
                          ILDB    TT,C
                          ADD     T,TT
                          ILDB    TT,D
                          ADD     T,TT
                          ILDB    TT,D
                          ADD     T,TT
                          IDPB    T,E                     ;THEN DEPOSIT SUM
                          SOJG    TTT,CLLP
                          SOJG    F,LNLP
                          JRST    @RETAD    ]

LNLP1:	MOVE	TTT,LNBY(ARRY2)		;NO OF BYTES, INNER LOOP CNTR
	MOVE	C,A
	ADD	A,LNWD(ARRY1)		;BP S FOR ARRY1
	MOVE	D,A
	ADD	A,LNWD(ARRY1)
	MOVE	E,B			;BP FOR ARRY2
	ADD	B,LNWD(ARRY2)
CLLP1:	ILDB	T,C			;FETCH FOUR BYTES AND ADD THEM
	ILDB	TT,C
	ADD	T,TT
	ILDB	TT,D
	ADD	T,TT
	ILDB	TT,D
	ADD	T,TT
	LSH	T,(G)			;TRUNCATE TO CORRECT # OF BITS
	IDPB	T,E			;THEN DEPOSIT SUM
	SOJG	TTT,CLLP1
	SOJG	F,LNLP1
	JRST	@RETAD
GETPAR:	POP	P,RETAD
	POP	P,ARRY2			;COPIES A FULL WORD ARRAY
	POP	P,ARRY1			;INTO A PICTURE

	MOVE	B,BPTAB(ARRY2)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY2)
	MOVE	F,PCLN(ARRY2)		;NO OF LINES, FOR COUNT

LNLPG:	MOVE	TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY2)
CLLPG:	MOVE    T,(ARRY1)               ;FETCH A WORD
	ADDI	ARRY1,1
	IDPB    T,E                     ;AND DEPOSIT A BYTE
	SOJG    TTT,CLLPG
	SOJG    F,LNLPG
	JRST    @RETAD
PERBIT:	POP	P,RETAD
	POP	P,ARRY2  ;transform	;TRANSFORMS EACH SAMPLE OF A
	POP	P,ARRY1	 ;picture	;PICTURE ACCORDING TO A TABLE

	HRRM	ARRY2,ARF

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY1)
	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPP:	MOVE	TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
CLLPP:	ILDB    T,E			;FETCH A SAMPLE
ARF:	MOVE	T,(T)			;altered to <ARRY2>(T)
	DPB	T,E                     ;AND DEPOSIT IT
	SOJG    TTT,CLLPP
	SOJG    F,LNLPP
	JRST    @RETAD
HISTOG:	POP	P,RETAD
	POP	P,ARRY2  ;HISTOGRAM	;MAKES A HISTOGRAM OF THE
	POP	P,ARRY1	 ;picture	;GREY LEVELS IN A PICTURE

	HRRM	ARRY2,ARFG
	HRRM	ARRY2,ARFH

	MOVEI	A,1
	LSH	A,@BYBI(ARRY1)
	SUBI	A,1
ARFH:	SETZM	(A)			;CLEAR THE ARRAY
	SOJGE	A,ARFH


	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY1)
	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPH:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
CLLPH:	ILDB    T,E			;FETCH A SAMPLE
ARFG:	AOS	(T)			;altered to <ARRY2>(T)
	SOJG    TTT,CLLPH
	SOJG    F,LNLPH
	JRST    @RETAD
ROWSUM:	POP	P,RETAD
	POP	P,ARRY2  ;ROW SUMS	;calculates the sum of each row of a pict
	POP	P,ARRY1	 ;picture

	HRRM	ARRY2,ARFS

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR ARRY2
	ADD	B,LINTAB(ARRY1)

	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPS:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
	SETZM	@ARFS
CLLPS:	ILDB    T,E			;FETCH A SAMPLE
ARFS:	ADDM	T,0			;altered to <ARRY2>(TTT)
	SOJG    TTT,CLLPS
	AOS	ARFS
	SOJG    F,LNLPS
	JRST    @RETAD
UNPACK:	POP	P,RETAD	; UNPACK A DENSE BYTE ARRAY INTO A PICTURE
	POP	P,ARRY1  ;destination picture
	POP	P,ARRY2	 ;original packed array

	MOVE 	C,BPTAB(ARRY1)
	ADD	ARRY2,-1(C)		;construct byte pntr for source array

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;AND FIRST BP FOR destination
	ADD	B,LINTAB(ARRY1)

	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPU:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
CLLPU:	ILDB	T,C
	IDPB    T,E			;MOVE A SAMPLE
	SOJG    TTT,CLLPU
	SOJG    F,LNLPU
	JRST    @RETAD
SELECT:	POP	P,RETAD	 ;copy a piece of a picture into another
	POP	P,ARRY2  ;destination picture
	POP	P,B		;XEDGE
	POP	P,A		;YEDGE
	POP	P,ARRY1	 ;source picture, part of which is to be copied

	ADD	B,BPTAB(ARRY1)		;SYNTHESIZE BYTE POINTER
	MOVE	B,-1(B)			;FOR SOURCE ARRAY
	ADDI	A,LINTAB(ARRY1)
	ADD	B,(A)

	MOVE	A,BPTAB(ARRY2)
	MOVE	A,-1(A)			;AND FIRST BP FOR destination
	ADD	A,LINTAB(ARRY2)

	MOVE	D,BYBI(ARRY2)
	SUB	D,BYBI(ARRY1)

	MOVE	F,PCLN(ARRY2)		;NO OF LINES, FOR COUNT

LNLPL:	MOVE	TTT,LNBY(ARRY2) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
	MOVE	C,A
	ADD	A,LNWD(ARRY2)
CLLPL:	ILDB	T,E
        LSH	T,(D)
	IDPB    T,C			;MOVE A SAMPLE
	SOJG    TTT,CLLPL
	SOJG    F,LNLPL
	JRST    @RETAD
ROWSUD:	POP	P,RETAD			;much quicker and dirtier than ROWSUM
	POP	P,ARRY2  ;ROW SUMS	;roughly calculates row sums
	POP	P,ARRY1	 ;picture

	SUBI	ARRY2,1

	MOVN	B,LNWD(ARRY1)

	MOVE	TTT,LINTAB(ARRY1)
	MOVE	F,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPD:	HRL	TTT,B		 	;NO OF WORDS, INNER LOOP CNTR
	MOVEI	TT,0
CLLPD:	HLRZ    T,(TTT)			;FETCH A SAMPLE, SORT OF
	ADD	TT,T
	AOBJN   TTT,CLLPD
	PUSH	ARRY2,TT
	SOJG    F,LNLPD
	JRST    @RETAD
SHFT1←←TEMP+1

CMPPAR:	POP	P,RETAD
	POP	P,ARRY2  ;picture y	;compares two pictures
	POP	P,ARRY1	 ;picture x	;sigma(xi-yi)↑2/n

	MOVE	B,BPTAB(ARRY1)
	MOVE	B,-1(B)			;FIRST BP FOR ARRY1
	ADD	B,LINTAB(ARRY1)

	MOVE	C,BPTAB(ARRY2)
	MOVE	C,-1(C)			;AND FIRST BP FOR ARRY2
	ADD	C,LINTAB(ARRY2)

	MOVEI	T,5			;CALCULATE NORMALIZATION SHIFT
	SUB	T,BYBI(ARRY1)		;FOR MAKING SAMPLES 5 BITS
	HRRZM	T,SHFT1

	MOVEI	A,0			;INITIALIZE SUM

	MOVE	G,PCLN(ARRY1)		;NO OF LINES, FOR COUNT

LNLPC:	MOVE	TTT,LNBY(ARRY1) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
	MOVE	F,C
	ADD	C,LNWD(ARRY2)
CLLPC:	ILDB    T,E			;FETCH A SAMPLE
	ILDB	TT,F
	SUB	T,TT
	ASH	T,@SHFT1
	ADD	A,SQRS(T)		;and add (xi-yi)↑2 to A
	SOJG    TTT,CLLPC
	SOJG    G,LNLPC
        TLZ	A,777774
	IDIV	A,PCLN(ARRY1)
	IDIV	A,LNBY(ARRY1)
	MOVE	1,A

	JRST    @RETAD
COPPIC:	POP	P,RETAD			;COPIES A PICTURE IN PIC1
	POP	P,ARRY2			;INTO PIC2 (THE LINE TABLE MUST
	POP	P,ARRY1			;BE ADJUSTED TO DO THIS)
	HRLZ	T,ARRY1			;  COPPIC(PIC1,PIC2)
	HRR	T,ARRY2
	MOVEI	TT,13(ARRY2)
	ADD	TT,PCLN(ARRY1)
	ADD	TT,LNBYA(ARRY1)
	ADD	TT,PCWD(ARRY1)
	BLT	T,(TT)
	MOVE	T,ARRY2
	SUB	T,ARRY1
	MOVN	TT,PCLN(ARRY1)
	SUBI	TT,1
	HRLZ	TT,TT
	HRRI	TT,BPTAB(ARRY2)
COPLP:	ADDM	T,(TT)
	AOBJN	TT,COPLP
	JRST	@RETAD
CORNR←←TEMP				;THESE FOUR WORDS MUST
HORIZ←←TEMP+1				;BE KEPT IN THIS ORDER
CENTR←←TEMP+2
VERTI←←TEMP+3
WHERTO: BYTE	(2)0,3,3,0,1,2,2,1,1,2,2,1,0,3,3,0
WHERPN:	POINT	2,WHERTO

VERCNT←←TEMP+4
HORCNT←←TEMP+5

FLAPIC:	POP	P,RETAD			;HIGH PASS FILTER WITH A CUTOFF
	POP	P,ARRY1			;1/FREQUENCY APPROIMATELY HALF THE
	SETZM	CORNR
	SETZM	HORIZ
	SETZM	VERTI
	SETZM	CENTR
	MOVE	T,PCLN(ARRY1)		;WIDTH AND HEIGHT OF THE PICTURE,
        MOVE	TT,T			;MAINLY TO REMOVE THE EFFECTS
	ASH	T,-2			;OF COS↑2 DARKENING AT THE EDGES
	MOVEM	T,VERCNT		;  FLAPIC(PICTURE)
      	MOVE	T,LNBY(ARRY1)
	ASH	T,-2			;THE LIMITS OF EACH GRID POINT
	MOVEM	T,HORCNT





X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
AX1←←TEMP ↔ AY1←←TEMP+1 ↔ AX2←←TEMP+2 ↔ AY2←←TEMP+3
BX1←←TEMP+4 ↔ BY1←←TEMP+5 ↔ BX2←←TEMP+6 ↔ BY2←←TEMP+7
SOUWIN←←TEMP+10 ↔ DESWIN←←TEMP+11 ↔ DEXSKP←←TEMP+12 ↔ DEYSKP←←TEMP+13
WSIZ1←←TEMP+14 ↔ DWSIZ←←TEMP+15 ↔ WSIZY1←←TEMP+16 ↔ VARIAN←←TEMP+17
SOUSIZ←←TEMP+20 ↔ WSIZ←←TEMP+21 ↔ DWSIZ←←TEMP+22
SHFT1←←TEMP+23 ↔ SHFT2←←TEMP+24

MATCH:	POP	P,RETAD
	POP	P,BX2		;A CORRELATOR. FINDS THE BEST MATCH
	POP	P,BY2		;TO RECTANGLE ARRY1(AX1:AX2,AY1:AY2)
	POP	P,BX1		;IN ARRY2(BX1:BY1,BX2:BY2)
	POP	P,BY1		;ALL ARGUMENT ARE BY REFERENCE. THE
	POP	P,ARRY2		;A'S AND B'S MAY BE ADJUSTED TO MAKE
	MOVE	X1,@BX1		;THINGS FIT
	MOVE	X2,@BX2		;   MATCH(PIC1,AX1,AY1,AX2,AY2,
	MOVE	Y1,@BY1		;         PIC2,BX1,BY1,BX2,BY2);
	MOVE	Y2,@BY2

FIXB:	CAMLE	X1,X2		;FIRST FIX UP THE LIMITS SO
	EXCH	X1,X2		;X1≤X2, X1≥0 X2<WIDTH ETC.
	CAIGE	X1,0
	MOVEI	X1,0
	MOVE	T,LNBY(ARRY2)
	CAML	X2,T
	MOVEI	X2,-1(T)

	CAMLE	Y1,Y2		;SIMILAR FOR Y
	EXCH	Y1,Y2
	CAIGE	Y1,0
	MOVEI	Y1,0
	MOVE	T,PCLN(ARRY2)
	CAML	Y2,T
	MOVEI	Y2,-1(T)

	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	FIXB

	MOVEM	X1,@BX1
	MOVEM	X2,@BX2
	MOVEM	Y1,@BY1
	MOVEM	Y2,@BY2

	POP	P,AX2		;DO SAME FOR SOURCE WINDOW
	POP	P,AY2
	POP	P,AX1
	POP	P,AY1
	POP	P,ARRY1
	MOVE	X1,@AX1
	MOVE	X2,@AX2
	MOVE	Y1,@AY1
	MOVE	Y2,@AY2

	MOVEI	T,5		;CALCULATE SHIFTS NEEDED TO
	SUB	T,BYBI(ARRY1)	;CHANGE BOTH WINDOWS TO
	HRRZM	T,SHFT1		;FIVE BITS/SAMPLE (TO FIT THE SQUARES
	MOVEI	T,5		;TABLE)
	SUB	T,BYBI(ARRY2)
	HRRZM	T,SHFT2

FIXA:	CAMLE	X1,X2		;FIRST FIX UP THE LIMITS SO
	EXCH	X1,X2		;X1≤X2, X1≥0 X2<WIDTH ETC.
	CAIGE	X1,0
	MOVEI	X1,0
	MOVE	T,LNBY(ARRY1)
	CAML	X2,T
	MOVEI	X2,-1(T)

	CAMLE	Y1,Y2		;SIMILAR FOR Y
	EXCH	Y1,Y2
	CAIGE	Y1,0
	MOVEI	Y1,0
	MOVE	T,PCLN(ARRY1)
	CAML	Y2,T
	MOVEI	Y2,-1(T)

	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	FIXA

	MOVE	T,@BX1		;SHRINK SOURCE WINDOW SYMMETRICALLY
	SUB	T,@BX2		;UNTIL IT IS NO
	ADD	T,X2		;LARGER THAN DESTINATION WINDOW
	SUB	T,X1	
	JUMPLE	T,YSHRNK
	MOVEI	TT,1(T)
	ASHC	T,-1
	ADDI	X1,(T)
	SUBI	X2,(TT)

YSHRNK:	MOVE	T,@BY1		;SHRINK IN Y DIRECTION
	SUB	T,@BY2		;UNTIL IT IS NO
	ADD	T,Y2		;LARGER THAN DESTINATION WINDOW
	SUB	T,Y1	
	JUMPLE	T,RESTA
	MOVEI	TT,1(T)
	ASHC	T,-1
	ADDI	Y1,(T)
	SUBI	Y2,(TT)

RESTA:	MOVEM	X1,@AX1
	MOVEM	Y1,@AY1
	MOVEM	X2,@AX2
	MOVEM	Y2,@AY2

THIS←←TT ↔ SIZ←←TTT

	MOVEI	SIZ,1(X2)	;CALCULATE SIZE OF BUFFER AREA
	SUB	SIZ,X1		;FOR THE SOURCE WINDOW CODE
	MOVEM	SIZ,WSIZ1	;WILL BE X WINDOWSIZE-1
	MOVEM	SIZ,WSIZ	;IS X WINDOWSIZ
	MOVNM	SIZ,DEXSKP	;WILL BE DELTA XB - DELTA XA
	MOVEI	T,1(Y2)
	SUB	T,Y1
	MOVEM	T,WSIZY1	;WILL BE X WINDOWSIZE-1
	MOVNM	T,DEYSKP	;WIL BE DELTA YB - DELTA YA
	IMUL	SIZ,T
	MOVEM	SIZ,SOUSIZ	;SOURCE WINDOW SIZE (IN PIXELS)
	ASH	SIZ,1
	ADDI	SIZ,1
	PUSHJ	P,CORGET	;AND MAKE THAT BUFFER
	HALT
	MOVEM	THIS,SOUWIN

	SUBI	THIS,1
	MOVN	T,T
	HRLZ	T,T
	HRRI	T,LINTAB(ARRY1)	;Y COUNTER
	ADD	T,Y1

	MOVE	0,@BX2		;FINISH UP MAKING DELTA XB -DELTA XA
	SUB	0,@BX1
	ADDI	0,1
	MOVEM	0,DWSIZ
	ADDM	0,DEXSKP
	MOVE	0,@BY2		;AND THE Y'S TOO
	SUB	0,@BY1
	ADDI	0,1
	ADDM	0,DEYSKP
	SOS	WSIZ1		;NOT TO MENTION X WINDOWSIZ-1
	SOS	WSIZY1		;AND Y WINDOWSIZ-1

	MOVE	G,[MOVN TT,0(T)]

	MOVE	E,BPTAB(ARRY1)	;BP SKELETON
	ADDI	E,-1(X1)
	MOVE	E,(E)

	SETZB	B,A			;FOR SUM OF X AND X↑2, AS EXPLND BELOW
			;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
ILYLP:	MOVE	F,E			;SETS UP IN LINE CODED
	ADD	F,(T)			;STUFF FOR THE INNER
	MOVE	TTT,WSIZ		;"LOOP" OF THE CORRELATION
ILXLP:	PUSH	THIS,G			;A SEQUENCE OF
	ADDI	G,1			; MOVN TT,POSB(T)
	ILDB	C,F			; ADD  A,SQRS+PIXEL(TT)
	LSH	C,@SHFT1
	ADD	B,C
	ADD	A,SQRS(C)
	ADD	C,[ADD	A,SQRS(TT)]
	PUSH	THIS,C
	SOJG	TTT,ILXLP
	ADD	G,DEXSKP
	AOBJN	T,ILYLP
	TLZ	A,777774

	PUSH	THIS,[JRST INRDON]	;AND THE FINAL INSTR.
	
;CALCULATE SUM[(X-XBAR)↑2] ALSO. THIS IS SAME AS SUM[X↑2-2 X XBAR+XBAR↑2],
;WHICH IS SUM[X↑2]-2 XBAR SUM[X]+XBAR↑2*N OR, SINCE XBAR=SUM[X]/N,
;SUM[X↑2]-2(SUM[X])↑2/N+(SUM[X])↑2/N WHICH IS SUM[X↑2]-(SUM[X])↑2/N
; THIS QUANTITY WILL BE CALLED VARIANCE

	IMUL	B,B
	IDIV	B,SOUSIZ
	SUB	A,B
	MOVEM	A,VARIAN

	MOVE	X1,@BX1			;MAKE THE DESTINATION
	MOVE	X2,@BX2			;WINDOW BUFFER
	MOVE	Y1,@BY1
	MOVE	Y2,@BY2
	MOVEI	SIZ,1(X2)
	SUB	SIZ,X1
	MOVEM	SIZ,DWSIZ
	MOVEI	T,1(Y2)
	SUB	T,Y1
	IMUL	SIZ,T
	PUSHJ	P,CORGET
	HALT
	MOVEM	THIS,DESWIN

	SUBI	THIS,1
	MOVN	T,T			;Y COUNTER
	HRLZ	T,T
	HRRI	T,LINTAB(ARRY2)
	ADD	T,Y1

	MOVE	E,BPTAB(ARRY2)		;BYTE POINTER SKELETON
	ADDI	E,-1(X1)		;FOR DESTINATION
	MOVE	E,(E)

BUYLP:	MOVE	F,E			;UNPACKS THE DESTINATION
	ADD	F,(T)			;WINDOW, ONE WORD/SAMPLE
	MOVE	TTT,DWSIZ
BUXLP:	ILDB	0,F
	LSH	0,@SHFT2
	PUSH	THIS,0
	SOJG	TTT,BUXLP
	AOBJN	T,BUYLP

	MOVN	B,DEXSKP		;NOW ACTUALLY CORRELATE
	SUBI	B,1

	HRLZI	D,377777		;VALUE OF BEST MATCH IN D
	MOVE	E,DESWIN		;LOCATION IN E
	MOVE	C,DEYSKP		;NUMBER OF ROWS
	MOVE	T,DESWIN		;WHERE TO START
CRYLP:	HRL	T,B			;INIT X CNTR, BUT KEEP OLD POSN
CRXLP:	MOVEI	A,0			;ACCUMULATE CURRENT SUM IN A
	JRST	@SOUWIN			;JUMP TO PREVIOUSLY CREATED CODE
INRDON: TLZ	A,777774		;clear sum field, leaving only square
	CAML	A,D			;SEE IN NEW SUM IS BETTER
	JRST	.+3
	MOVE	D,A			;IF SO, RECORD IT
	HRRZ	E,T
	AOBJN	T,CRXLP			;SHIFT IN X, AND TRY AGAIN
	ADD	T,WSIZ1			;ADD WHATS NEEDED TO GET TO NEXT
	SOJGE	C,CRYLP			;SCANLINE, AND TRY AGAIN

	SUB	E,DESWIN		;DECOMPOSE SAVED BEST LOCATION
	IDIV	E,DWSIZ			;INTO X AND Y PARTS
	ADDB	E,@BY1			;ACTUAL LOWER Y BOUND OF BEST MATCH
	ADDB	F,@BX1			;ACTUAL LOWER X BOUND OF BEST MATCH
	ADD	F,WSIZ1			;COMPUTE UPPER X BOUND
	MOVEM	F,@BX2			;AND RETURN IT
	ADD	E,WSIZY1		;UPPER Y BOUND
	MOVEM	E,@BY2			;RETURNED

	MOVE	THIS,SOUWIN		;RETURN THE USED CORAGE
	PUSHJ	P,CORREL
	MOVE	THIS,DESWIN
	PUSHJ	P,CORREL

	MOVE	1,D			;GET READY TO RETURN VALUE OF MATCH
	ASH	1,4			;SCALE IT UP BY 2↑4
	IDIV	1,VARIAN		;NORMALIZE
	JRST	@RETAD			;AND RETURN
CENTRO:	POP	P,RETAD	 ;find centroid of black area in a window
	POP	P,E	  ;threshold
	POP	P,D	  ;X2
	POP	P,C	  ;Y2
	POP	P,B	  ;X1
	POP	P,A	  ;Y1
	POP	P,ARRY1	 ;source picture

	ADD	B,BPTAB(ARRY1)		;SYNTHESIZE BYTE POINTER
	MOVE	B,-1(B)			;FOR SOURCE ARRAY
	ADDI	A,LINTAB(ARRY1)
	ADD	B,(A)

X2←←D  ↔  Y2←←C  ↔  X1←←B  ↔  Y1←←A

	CAMLE	X1,X2			;FIX UP LIMITS
	EXCH	X1,X2
	CAMLE	Y1,Y2
	EXCH	Y1,Y2
	CAIL	X2,0
	CAML	X1,LNBY(ARRY1)
	JRST	GUPP
	CAIL	Y2,0
	CAML	Y1,PCLN(ARRY1)
	JRST	GUPP
	CAIGE	X1,0
	MOVEI	X1,0
	MOVE	T,LNBY(ARRY1)
	CAML	X2,T
	MOVEI	X2,-1(T)
	CAIGE	Y1,0
	MOVEI	Y1,0
	MOVE	T,PCLN(ARRY1)
	CAML	Y2,T
	MOVEI	Y2,-1(T)
	
	SUB	Y2,Y1			;NO OF LINES, FOR COUNT

	SUB	X2,X1			;NO OF COLUMNS


LNLCE:	MOVE	TTT,LNBY(ARRY2) 	;NO OF BYTES, INNER LOOP CNTR
	MOVE    E,B                     ;BP FOR ARRY2
	ADD     B,LNWD(ARRY1)
	MOVE	C,A
	ADD	A,LNWD(ARRY2)
CLLPCE:	ILDB	T,E
        LSH	T,(D)
	IDPB    T,C			;MOVE A SAMPLE
	SOJG    TTT,CLLPCE
	SOJG    F,LNLPCE
	JRST    @RETAD
	END